{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "from sklearn import model_selection\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn import metrics\n",
    "from sklearn.metrics import roc_auc_score\n",
    "#from hetroneModel.utils import *\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "# base\n",
    "import math\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import sys\n",
    "import datetime\n",
    "import re\n",
    "# data process\n",
    "from sklearn.preprocessing import OneHotEncoder\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.preprocessing import PolynomialFeatures, LabelBinarizer\n",
    "from pandas.api.types import is_numeric_dtype\n",
    "from pandas.api.types import is_string_dtype\n",
    "from sklearn.feature_extraction import DictVectorizer\n",
    "import seaborn as sns\n",
    "# model\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression, LogisticRegressionCV, LogisticRegression\n",
    "from sklearn.metrics import accuracy_score, roc_auc_score,f1_score\n",
    "from sklearn.ensemble import (RandomTreesEmbedding, RandomForestClassifier,\n",
    "                              GradientBoostingClassifier)\n",
    "import xgboost as xgb\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.externals import joblib\n",
    "import lightgbm as lgb\n",
    "# model test\n",
    "from sklearn.metrics import roc_curve, auc\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import  roc_auc_score\n",
    "from BuildModel import *\n",
    "import time\n",
    "from hyperopt import hp\n",
    "from hyperopt import fmin, tpe, hp, STATUS_OK, Trials\n",
    "import hyperopt.pyll.stochastic\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "df_transform = pd.read_csv('data/train_transform.csv', index_col= 'PERSONID')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C10E23D12</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C10E5D3</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2759E5D3</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E0D1</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E129D1</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E16D1</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E1D1</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E2D1</th>\n",
       "      <th>...</th>\n",
       "      <th>FTR49_std</th>\n",
       "      <th>FTR50_mean</th>\n",
       "      <th>FTR50_sum</th>\n",
       "      <th>FTR50_std</th>\n",
       "      <th>APPLYNO_count</th>\n",
       "      <th>FTR51_nunique</th>\n",
       "      <th>FTR51_max_med</th>\n",
       "      <th>FTR51_total_med</th>\n",
       "      <th>FTR51_type_med</th>\n",
       "      <th>LABEL_unique</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PERSONID</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>000e3ee6e04a8b18871e1c85ffab6e49</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>81</td>\n",
       "      <td>42</td>\n",
       "      <td>0</td>\n",
       "      <td>3625</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>000eba50dc8c2e3899070c6b82986814</th>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>84</td>\n",
       "      <td>48</td>\n",
       "      <td>0</td>\n",
       "      <td>4795</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>00139506cbd54b670e1e6dec234190e1</th>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>39</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "      <td>2763</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0014fdb3625079de4a0d2131fd860641</th>\n",
       "      <td>3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>153</td>\n",
       "      <td>51</td>\n",
       "      <td>0</td>\n",
       "      <td>6527</td>\n",
       "      <td>16</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>001de94e8d0d152e26ad87cb409003f9</th>\n",
       "      <td>4</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000138</td>\n",
       "      <td>0.008026</td>\n",
       "      <td>0.000306</td>\n",
       "      <td>58</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "      <td>2582</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 945 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                  Unnamed: 0  FTR51_max_group=A0B0C0E0D0  \\\n",
       "PERSONID                                                                   \n",
       "000e3ee6e04a8b18871e1c85ffab6e49           0                         0.0   \n",
       "000eba50dc8c2e3899070c6b82986814           1                         0.0   \n",
       "00139506cbd54b670e1e6dec234190e1           2                         0.0   \n",
       "0014fdb3625079de4a0d2131fd860641           3                         1.0   \n",
       "001de94e8d0d152e26ad87cb409003f9           4                         0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C10E23D12  \\\n",
       "PERSONID                                                                     \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                                       0.0   \n",
       "000eba50dc8c2e3899070c6b82986814                                       0.0   \n",
       "00139506cbd54b670e1e6dec234190e1                                       0.0   \n",
       "0014fdb3625079de4a0d2131fd860641                                       0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9                                       0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C10E5D3  \\\n",
       "PERSONID                                                                   \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                                     0.0   \n",
       "000eba50dc8c2e3899070c6b82986814                                     0.0   \n",
       "00139506cbd54b670e1e6dec234190e1                                     0.0   \n",
       "0014fdb3625079de4a0d2131fd860641                                     0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9                                     0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2759E5D3  \\\n",
       "PERSONID                                                                     \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                                       0.0   \n",
       "000eba50dc8c2e3899070c6b82986814                                       0.0   \n",
       "00139506cbd54b670e1e6dec234190e1                                       0.0   \n",
       "0014fdb3625079de4a0d2131fd860641                                       0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9                                       0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E0D1  \\\n",
       "PERSONID                                                                  \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                                    0.0   \n",
       "000eba50dc8c2e3899070c6b82986814                                    0.0   \n",
       "00139506cbd54b670e1e6dec234190e1                                    0.0   \n",
       "0014fdb3625079de4a0d2131fd860641                                    0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9                                    0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E129D1  \\\n",
       "PERSONID                                                                    \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                                      0.0   \n",
       "000eba50dc8c2e3899070c6b82986814                                      0.0   \n",
       "00139506cbd54b670e1e6dec234190e1                                      0.0   \n",
       "0014fdb3625079de4a0d2131fd860641                                      0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9                                      0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E16D1  \\\n",
       "PERSONID                                                                   \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                                     0.0   \n",
       "000eba50dc8c2e3899070c6b82986814                                     0.0   \n",
       "00139506cbd54b670e1e6dec234190e1                                     0.0   \n",
       "0014fdb3625079de4a0d2131fd860641                                     0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9                                     0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E1D1  \\\n",
       "PERSONID                                                                  \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                                    0.0   \n",
       "000eba50dc8c2e3899070c6b82986814                                    0.0   \n",
       "00139506cbd54b670e1e6dec234190e1                                    0.0   \n",
       "0014fdb3625079de4a0d2131fd860641                                    0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9                                    0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E2D1  \\\n",
       "PERSONID                                                                  \n",
       "000e3ee6e04a8b18871e1c85ffab6e49                                    0.0   \n",
       "000eba50dc8c2e3899070c6b82986814                                    0.0   \n",
       "00139506cbd54b670e1e6dec234190e1                                    0.0   \n",
       "0014fdb3625079de4a0d2131fd860641                                    0.0   \n",
       "001de94e8d0d152e26ad87cb409003f9                                    0.0   \n",
       "\n",
       "                                      ...       FTR49_std  FTR50_mean  \\\n",
       "PERSONID                              ...                               \n",
       "000e3ee6e04a8b18871e1c85ffab6e49      ...             0.0    0.000000   \n",
       "000eba50dc8c2e3899070c6b82986814      ...             0.0    0.000000   \n",
       "00139506cbd54b670e1e6dec234190e1      ...             0.0    0.000000   \n",
       "0014fdb3625079de4a0d2131fd860641      ...             0.0    0.000000   \n",
       "001de94e8d0d152e26ad87cb409003f9      ...             0.0    0.000138   \n",
       "\n",
       "                                  FTR50_sum  FTR50_std  APPLYNO_count  \\\n",
       "PERSONID                                                                \n",
       "000e3ee6e04a8b18871e1c85ffab6e49   0.000000   0.000000             81   \n",
       "000eba50dc8c2e3899070c6b82986814   0.000000   0.000000             84   \n",
       "00139506cbd54b670e1e6dec234190e1   0.000000   0.000000             39   \n",
       "0014fdb3625079de4a0d2131fd860641   0.000000   0.000000            153   \n",
       "001de94e8d0d152e26ad87cb409003f9   0.008026   0.000306             58   \n",
       "\n",
       "                                  FTR51_nunique  FTR51_max_med  \\\n",
       "PERSONID                                                         \n",
       "000e3ee6e04a8b18871e1c85ffab6e49             42              0   \n",
       "000eba50dc8c2e3899070c6b82986814             48              0   \n",
       "00139506cbd54b670e1e6dec234190e1             21              0   \n",
       "0014fdb3625079de4a0d2131fd860641             51              0   \n",
       "001de94e8d0d152e26ad87cb409003f9             31              0   \n",
       "\n",
       "                                  FTR51_total_med  FTR51_type_med  \\\n",
       "PERSONID                                                            \n",
       "000e3ee6e04a8b18871e1c85ffab6e49             3625              16   \n",
       "000eba50dc8c2e3899070c6b82986814             4795              16   \n",
       "00139506cbd54b670e1e6dec234190e1             2763              16   \n",
       "0014fdb3625079de4a0d2131fd860641             6527              16   \n",
       "001de94e8d0d152e26ad87cb409003f9             2582              16   \n",
       "\n",
       "                                  LABEL_unique  \n",
       "PERSONID                                        \n",
       "000e3ee6e04a8b18871e1c85ffab6e49             0  \n",
       "000eba50dc8c2e3899070c6b82986814             0  \n",
       "00139506cbd54b670e1e6dec234190e1             0  \n",
       "0014fdb3625079de4a0d2131fd860641             2  \n",
       "001de94e8d0d152e26ad87cb409003f9             0  \n",
       "\n",
       "[5 rows x 945 columns]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_transform.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train = df_transform.loc[df_transform.LABEL_unique != 2,:]\n",
    "df_test = df_transform.loc[df_transform.LABEL_unique ==2, :]\n",
    "df_test.drop(['LABEL_unique'], axis = 1, inplace= True)\n",
    "\n",
    "Y = df_train.loc[:,'LABEL_unique']\n",
    "X = df_train.drop(['LABEL_unique'], axis = 1)\n",
    "X_train, X_test, y_train, y_test = model_selection.train_test_split(X, Y, test_size=0.3, random_state=0)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n",
       "        colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
       "        max_depth=3, min_child_weight=1, missing=None, n_estimators=100,\n",
       "        n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,\n",
       "        reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n",
       "        silent=True, subsample=1), 0.9060283508373929)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bm = BaseModelClass()\n",
    "model_xgb, auc_xgb = bm.SklearnClassifier(X_train, X_test, y_train, y_test, model_type= XGBClassifier)\n",
    "model_xgb,auc_xgb\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "# from sklearn.datasets import load_breast_cancer\n",
    "# canser = load_breast_cancer()\n",
    "# X = pd.DataFrame(data = canser.data, columns= canser.feature_names)\n",
    "# Y = pd.DataFrame(data = canser.target, columns = ['label'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          4        0.8  -0.906664\n",
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          5        0.8  -0.908956\n",
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          4        0.8  -0.906664\n",
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          4        0.8  -0.906664\n",
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          4        0.8  -0.906664\n",
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          5        0.8  -0.908956\n",
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          4        0.8  -0.906664\n",
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          4        0.8  -0.906664\n",
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          5        0.8  -0.908956\n",
      "parameter and score:\n",
      "     max_depth  subsample  auc_score\n",
      "0          5        0.8  -0.908956\n"
     ]
    }
   ],
   "source": [
    "hpc = HyperParModelClass()\n",
    "space_xgb_init = {'subsample':0.8}\n",
    "space_xgb = {'max_depth': hp.quniform(\"max_depth\", 3.5, 5.5, 1)}\n",
    "parda_xgb = hpc.HpOpt(X, Y , X.index , space_xgb, bm.SklearnClassifier, model_type = XGBClassifier,\\\n",
    "    parainit = space_xgb_init, max_evals = 10, verbose = True)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#model_lr, auc_lr = bm.SklearnClassifier(X_train, X_test, y_train, y_test, model_type= LogisticRegression)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(15000, 944)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C10E23D12</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C10E5D3</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2759E5D3</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E0D1</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E129D1</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E16D1</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E1D1</th>\n",
       "      <th>FTR51_max_group=A0B0C0E0D0,A0B0C2E2D1</th>\n",
       "      <th>...</th>\n",
       "      <th>FTR49_sum</th>\n",
       "      <th>FTR49_std</th>\n",
       "      <th>FTR50_mean</th>\n",
       "      <th>FTR50_sum</th>\n",
       "      <th>FTR50_std</th>\n",
       "      <th>APPLYNO_count</th>\n",
       "      <th>FTR51_nunique</th>\n",
       "      <th>FTR51_max_med</th>\n",
       "      <th>FTR51_total_med</th>\n",
       "      <th>FTR51_type_med</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PERSONID</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b2f0c5b71845b1bb6865dacd3eac454a</th>\n",
       "      <td>12200</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000109</td>\n",
       "      <td>0.031284</td>\n",
       "      <td>0.000291</td>\n",
       "      <td>288</td>\n",
       "      <td>66</td>\n",
       "      <td>0</td>\n",
       "      <td>5523</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9e1b67207bf6b4a2a458700a8c519734</th>\n",
       "      <td>10794</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000106</td>\n",
       "      <td>0.006767</td>\n",
       "      <td>0.000263</td>\n",
       "      <td>64</td>\n",
       "      <td>34</td>\n",
       "      <td>0</td>\n",
       "      <td>2137</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0e4dfe053cbd52c3ae3a0ef094fe1390</th>\n",
       "      <td>953</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000075</td>\n",
       "      <td>0.008775</td>\n",
       "      <td>0.000223</td>\n",
       "      <td>117</td>\n",
       "      <td>56</td>\n",
       "      <td>0</td>\n",
       "      <td>5587</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c4da5b6c0d49e72ff9e36d6cd9502a22</th>\n",
       "      <td>13426</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000969</td>\n",
       "      <td>0.024231</td>\n",
       "      <td>0.001116</td>\n",
       "      <td>25</td>\n",
       "      <td>15</td>\n",
       "      <td>0</td>\n",
       "      <td>826</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c8b6b95bfa90cbb6572a6c4cb16c08b4</th>\n",
       "      <td>13679</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>139</td>\n",
       "      <td>57</td>\n",
       "      <td>0</td>\n",
       "      <td>4068</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 944 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                  Unnamed: 0  FTR51_max_group=A0B0C0E0D0  \\\n",
       "PERSONID                                                                   \n",
       "b2f0c5b71845b1bb6865dacd3eac454a       12200                         1.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734       10794                         0.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390         953                         0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22       13426                         1.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4       13679                         1.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C10E23D12  \\\n",
       "PERSONID                                                                     \n",
       "b2f0c5b71845b1bb6865dacd3eac454a                                       0.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734                                       0.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390                                       0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22                                       0.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4                                       0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C10E5D3  \\\n",
       "PERSONID                                                                   \n",
       "b2f0c5b71845b1bb6865dacd3eac454a                                     0.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734                                     1.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390                                     0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22                                     0.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4                                     0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2759E5D3  \\\n",
       "PERSONID                                                                     \n",
       "b2f0c5b71845b1bb6865dacd3eac454a                                       0.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734                                       0.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390                                       0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22                                       0.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4                                       0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E0D1  \\\n",
       "PERSONID                                                                  \n",
       "b2f0c5b71845b1bb6865dacd3eac454a                                    0.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734                                    0.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390                                    0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22                                    0.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4                                    0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E129D1  \\\n",
       "PERSONID                                                                    \n",
       "b2f0c5b71845b1bb6865dacd3eac454a                                      0.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734                                      0.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390                                      0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22                                      0.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4                                      0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E16D1  \\\n",
       "PERSONID                                                                   \n",
       "b2f0c5b71845b1bb6865dacd3eac454a                                     0.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734                                     0.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390                                     0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22                                     0.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4                                     0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E1D1  \\\n",
       "PERSONID                                                                  \n",
       "b2f0c5b71845b1bb6865dacd3eac454a                                    0.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734                                    0.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390                                    0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22                                    0.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4                                    0.0   \n",
       "\n",
       "                                  FTR51_max_group=A0B0C0E0D0,A0B0C2E2D1  \\\n",
       "PERSONID                                                                  \n",
       "b2f0c5b71845b1bb6865dacd3eac454a                                    0.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734                                    0.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390                                    0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22                                    0.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4                                    0.0   \n",
       "\n",
       "                                       ...        FTR49_sum  FTR49_std  \\\n",
       "PERSONID                               ...                               \n",
       "b2f0c5b71845b1bb6865dacd3eac454a       ...              0.0        0.0   \n",
       "9e1b67207bf6b4a2a458700a8c519734       ...              0.0        0.0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390       ...              0.0        0.0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22       ...              0.0        0.0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4       ...              0.0        0.0   \n",
       "\n",
       "                                  FTR50_mean  FTR50_sum  FTR50_std  \\\n",
       "PERSONID                                                             \n",
       "b2f0c5b71845b1bb6865dacd3eac454a    0.000109   0.031284   0.000291   \n",
       "9e1b67207bf6b4a2a458700a8c519734    0.000106   0.006767   0.000263   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390    0.000075   0.008775   0.000223   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22    0.000969   0.024231   0.001116   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4    0.000000   0.000000   0.000000   \n",
       "\n",
       "                                  APPLYNO_count  FTR51_nunique  FTR51_max_med  \\\n",
       "PERSONID                                                                        \n",
       "b2f0c5b71845b1bb6865dacd3eac454a            288             66              0   \n",
       "9e1b67207bf6b4a2a458700a8c519734             64             34              0   \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390            117             56              0   \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22             25             15              0   \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4            139             57              0   \n",
       "\n",
       "                                  FTR51_total_med  FTR51_type_med  \n",
       "PERSONID                                                           \n",
       "b2f0c5b71845b1bb6865dacd3eac454a             5523              16  \n",
       "9e1b67207bf6b4a2a458700a8c519734             2137              16  \n",
       "0e4dfe053cbd52c3ae3a0ef094fe1390             5587              16  \n",
       "c4da5b6c0d49e72ff9e36d6cd9502a22              826              16  \n",
       "c8b6b95bfa90cbb6572a6c4cb16c08b4             4068              16  \n",
       "\n",
       "[5 rows x 944 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(X.shape)\n",
    "X_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "# lgb model\n",
    "def lgb_sklearn(train_x, test_x, train_y, test_y):\n",
    "    gbm = lgb.LGBMClassifier(objective='binary',\n",
    "                             # n_jobs=-1,\n",
    "                             is_unbalance=True,\n",
    "                             # num_threads=8,\n",
    "                             two_round=True,\n",
    "                             bagging_fraction=1,\n",
    "                             bagging_freq=1,\n",
    "                             boosting_type='gbdt',    # gbdt\n",
    "                             feature_fraction=0.8,\n",
    "                             learning_rate=0.01,\n",
    "                             # min_child_samples=10,\n",
    "                             # min_child_weight=5,\n",
    "                             # min_data_in_leaf=20,\n",
    "                             # min_split_gain=0.0,\n",
    "                             n_estimators=800,\n",
    "                             num_leaves=32,\n",
    "                             reg_alpha=0.001,      # 减少过拟合，概率分布更两极化\n",
    "                             # reg_lambda=0.00001,\n",
    "                             # subsample=0.5,     # 没有影响\n",
    "                             silent=False,\n",
    "                             verbose=2\n",
    "                             )\n",
    "    estimators = gbm.fit(train_x,train_y)\n",
    "\n",
    "    y_pred = estimators.predict_proba(test_x)[:,1]\n",
    "    y_predict = [1 if i > 0.5 else 0 for i in y_pred]\n",
    "    print(\"lgb model auc: \", roc_auc_score(test_y, y_pred))\n",
    "    print(\"lgb f1score: \",f1_score(test_y, y_predict, average='binary'))\n",
    "    PlotKS(y_pred,test_y,445,0) \n",
    "    plt.hist(y_pred)\n",
    "    plt.show()\n",
    "    return estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "# KS 曲线\n",
    "def PlotKS(preds, labels, n, asc):\n",
    "    # preds is score: asc=1\n",
    "    # preds is prob: asc=0\n",
    "\n",
    "    pred = preds  # 预测值\n",
    "    bad = labels  # 取1为bad, 0为good\n",
    "    ksds = pd.DataFrame({'bad': bad, 'pred': pred})\n",
    "    ksds['good'] = 1 - ksds.bad\n",
    "\n",
    "    if asc == 1:\n",
    "        ksds1 = ksds.sort_values(by=['pred', 'bad'], ascending=[True, True])\n",
    "    elif asc == 0:\n",
    "        ksds1 = ksds.sort_values(by=['pred', 'bad'], ascending=[False, True])\n",
    "    ksds1.index = range(len(ksds1.pred))\n",
    "    ksds1['cumsum_good1'] = 1.0 * ksds1.good.cumsum() / sum(ksds1.good)\n",
    "    ksds1['cumsum_bad1'] = 1.0 * ksds1.bad.cumsum() / sum(ksds1.bad)\n",
    "\n",
    "    if asc == 1:\n",
    "        ksds2 = ksds.sort_values(by=['pred', 'bad'], ascending=[True, False])\n",
    "    elif asc == 0:\n",
    "        ksds2 = ksds.sort_values(by=['pred', 'bad'], ascending=[False, False])\n",
    "    ksds2.index = range(len(ksds2.pred))\n",
    "    ksds2['cumsum_good2'] = 1.0 * ksds2.good.cumsum() / sum(ksds2.good)\n",
    "    ksds2['cumsum_bad2'] = 1.0 * ksds2.bad.cumsum() / sum(ksds2.bad)\n",
    "\n",
    "    # ksds1 ksds2 -> average\n",
    "    ksds = ksds1[['cumsum_good1', 'cumsum_bad1']]\n",
    "    ksds['cumsum_good2'] = ksds2['cumsum_good2']\n",
    "    ksds['cumsum_bad2'] = ksds2['cumsum_bad2']\n",
    "    ksds['cumsum_good'] = (ksds['cumsum_good1'] + ksds['cumsum_good2']) / 2\n",
    "    ksds['cumsum_bad'] = (ksds['cumsum_bad1'] + ksds['cumsum_bad2']) / 2\n",
    "\n",
    "    # ks\n",
    "    ksds['ks'] = ksds['cumsum_bad'] - ksds['cumsum_good']\n",
    "    ksds['tile0'] = range(1, len(ksds.ks) + 1)\n",
    "    ksds['tile'] = 1.0 * ksds['tile0'] / len(ksds['tile0'])\n",
    "\n",
    "    qe = list(np.arange(0, 1, 1.0 / n))\n",
    "    qe.append(1)\n",
    "    qe = qe[1:]\n",
    "\n",
    "    ks_index = pd.Series(ksds.index)\n",
    "    ks_index = ks_index.quantile(q=qe)\n",
    "    ks_index = np.ceil(ks_index).astype(int)\n",
    "    ks_index = list(ks_index)\n",
    "\n",
    "    ksds = ksds.loc[ks_index]\n",
    "    ksds = ksds[['tile', 'cumsum_good', 'cumsum_bad', 'ks']]\n",
    "    ksds0 = np.array([[0, 0, 0, 0]])\n",
    "    ksds = np.concatenate([ksds0, ksds], axis=0)\n",
    "    ksds = pd.DataFrame(ksds, columns=['tile', 'cumsum_good', 'cumsum_bad', 'ks'])\n",
    "\n",
    "    ks_value = ksds.ks.max()\n",
    "    ks_pop = ksds.tile[ksds.ks.idxmax()]\n",
    "    print ('ks_value is ' + str(np.round(ks_value, 4)) + ' at pop = ' + str(np.round(ks_pop, 4)))\n",
    "\n",
    "    # chart\n",
    "    plt.plot(ksds.tile, ksds.cumsum_good, label='cum_good',\n",
    "             color='blue', linestyle='-', linewidth=2)\n",
    "\n",
    "    plt.plot(ksds.tile, ksds.cumsum_bad, label='cum_bad',\n",
    "             color='red', linestyle='-', linewidth=2)\n",
    "\n",
    "    plt.plot(ksds.tile, ksds.ks, label='ks',\n",
    "             color='green', linestyle='-', linewidth=2)\n",
    "\n",
    "    plt.axvline(ks_pop, color='gray', linestyle='--')\n",
    "    plt.axhline(ks_value, color='green', linestyle='--')\n",
    "    plt.axhline(ksds.loc[ksds.ks.idxmax(), 'cumsum_good'], color='blue', linestyle='--')\n",
    "    plt.axhline(ksds.loc[ksds.ks.idxmax(), 'cumsum_bad'], color='red', linestyle='--')\n",
    "    plt.title('KS=%s ' % np.round(ks_value, 4) +\n",
    "              'at Pop=%s' % np.round(ks_pop, 4), fontsize=15)\n",
    "\n",
    "    plt.show()\n",
    "    return ksds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lgb model auc:  0.9072605556061941\n",
      "lgb f1score:  0.4478935698447894\n",
      "ks_value is 0.6442 at pop = 0.2116\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEKCAYAAADpfBXhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzsnXd4VEUXh99JSIBAKCH0IkWKEHoHBQRRmhRpKogg0tEPFRUVFRCwgWKjKRDEgoCgiIB0UIoQIEAooUoVSQIkkJC68/1xNhCSkAJJbnYz7/Pss3vvnb3zy+7N2blnzpyjtNYYDAaDwblwsVqAwWAwGDIeY9wNBoPBCTHG3WAwGJwQY9wNBoPBCTHG3WAwGJwQY9wNBoPBCTHGPZuglBqnlApOtM9FKfW9UipSKfWofV8+pdR7SqlApdQNpdR/SqnNSqmBGaChuVLqb/t5TymlXkzHewcrpQLsWv9TSv2UQttRSimtlFqSQpt8Sqlz9nY+CfYXUEqNV0rtVEqFKqUuKqWWKaWqpP0vTfHvaKSUGpfGtr52fVopZVNKnVZKzVNKFc8ILRmBUiq3UmqqUuqSUipcKfW7Uqp8Ku9J02eslHJXSn2slPrTfs0kG1etlGqrlPpRKfWP/bMal0LfTyildtnPF6KUWq2UyncXf3qOxxj3bIpSSgFfAz2BnlrrNfZDPwODgS+BDsCLQID99b30dz/wB3AK6AjMAj5RSj2fhvdOBD4CfIHHgBeA4Du0LQa8AwSlctq3gFzJ7C8HDLJr7QEMAUoCfyulyqamNQ00At5NR/sjQFPgQWAi8tktV0pll/+tz4H+wGjk8/IG1iql8qTwnrR+xh7A80AEsC2F87UDagHr7W2TxX6t/QCsAtrbz32M5K8DQ2porc0jGzyAcUBwgu2vgFige4J9lQGNGPvE71f32P8s4CiQK8G+6cDZlM4N1ADigLZp7GcOsADYBCy5Q5v7gevAUPvf65PgWD4gb6L2Xvb272bA9zBS/i3S1NYX8Eu0r69dc8NscE2VsV9D/RLsKw1EA8+n8L40f8bx10ZKnxvgkuB1MDAumTbewDVgkNWfm7M8ssvowpAApdRUxLD101r/nOBQIfvzxcTv0fb/kHugPbBUax2bYN9CxED4JP8WAJ4FTmit16bWgVKqIdALGJNK02nAN8io+Da01uFa6xuJ9l0GTgPFUum/qVJquVLqgt1F4a+U6pPgeH/gC/vreHfLptT+rkTstj+XT3DekUqpY0qpKKXUcaXUS4l0jVNKBdvdYnvsri1/pdSD6ew7MY/an5fG79Banwf+Qr7vZEnPZ5yW605rbUuD1l725/lpaGtIA8a4ZzOUUpOAl5CR1Q+JDgcC4cA0pdSjKd1aK6VypeGh7G3zAWVJakwP25+rpSC5MXAggYGKUkqtU0o9kEiPQlxJH9kNzJ10dwCaAONT6DPxe4oio/1DqTS9D9iK3O4/jri45imlnrIf/x2Yan/d1P4YnlYddsrbny/atQ1CfjCW2/tcDExVSiX+gfMAvgNmIq64q8AqpVSJ+AZK5mBS+05dE5yzGnBOa309UV+HSfk7TUI6PuO7pTFyfQ+0z7XEKJn/aZZJ/Tk/Vt86mIc8ELeMtj8+SaHdU8jtsUZur7cg/lGVoE35BOdK6dHK3r60fbtror5y2fcPTkFPIHI7fQjohhiwfcgoL0+Cds/Z9+W1b28ikVsGcEd8rMPt261I5Ja5g4ZvgRCgSDo+b2X/+2YBGxLsT7dbxn4ed6AOcAA4gxhrF+A8MC/R+6YDofGfT4Lv/ukEbfIDl4EPEvWX2ne6KUH7rwH/ZHRPBC6k8/pM8TNO6+fGnd0yf9ivo/NAH8RPvwEIA4pb9X/pyA8zUZG9CENGVQOVUt9qrf0TN9Ba/6iUWgN0Bh5Gbr1nA60Rww9wAWiYhv4CE5/+Du1SuvV2QXy03bXWhwGUUgcR/30fYI5SqiAwGXhRJ7rdT8TLQCRicNOEUmoY4ufurrUOSaVtYeSOoAvygxY/yr3jnUQaqA/EJNgOAHporSOUUuWAUshoPSE/AcOAmsCuBPuXxb/QWl9XSq1FJnjjGYfc/aTEtUTbyX136g77kyU9n/E94IL8oPXUWq+297sNGRCMBN7OpH6dFmPcsxcxSLTFX8gteXOt9cnEjez/YPMQl4IbYgwHKKU+0Frv01pHK6WS/DAkQ5z9+ar9uVCi44UTHU+Oy0D+eMNu13dSKfUPUN2+601kYnaNUiq+j1yAm337GjJh9xYS2eFp9xjlt7f1VErl01qHJ+xYKdUZcXm8rrVeRur4Ii6f95A7jTDEyHZJw3vvxGGgH/JZntdaX0pwrKT9+b9E74nf9kqw73oyP3yXkCiTeM4A51LRk9BoXyHpd4p9X0rf6U3u4jO+Wy7bnzfF79BahymldnPrOjKkA+Nzz2bYDfejSJTDH/bQwZTaxwCf2jerAdjjmGPS8GhpP0c4YnwT+2Hjt5NMbCbg8B32KyB+Iq0q0AAxNvGP5sjdxxXEt10aMeZLErT5zf7+bcCvt51cfLELgZla649T0BffPg/yw/mu1vpLrfUGrbUf9/4/EKG19tNa701k2AH+tT8n/g7j4+AvJ9iXXymVN1G7YgnOATCX1L/T9QnaHwHKJhMnXo2Uv1Mg/Z/xPXIY+WFSiWVw6zoypAMzcs+GaK3PKqXaAX8iI/hWWutrSilPIDaZEV5l+3P8iPBu3DKrgG5KqbFa6/gRfW/E6AekcI4VwLNKqepa60MASqlKyOTlPnubsUgETEKmIX7ndxE/dRziZkpIHeSH6zlgT/xOpVQNe7+rkTj/tJAbccNEJTiPJ/IDk3C0G20/lkdrHZnGc9+Jc8h30RP5fOPphdw1HEjUvhsS541SKj/QFnG5xTOO9Lll4tdGdEMma1FKlQIeIpWJ4rv8jO+FFci18DCw0q6hIOL2mpIF/TsfVjv9zUMeJIpzt+9rhiz6WIdM2DVAjMVEZNFSK2AUsiBoLwli1O+i//jY8h+Qf7DXkJHg84naxQLvJNh2RcL/jiALXrohRusQ4JZCf5u4Q5x7gjatSBrnXgz5wTljP94kwaN6KufbiSzS6m7X+TdwktvXF7Sw9/k68gNZNYXz+ZIozj2ZNoOQkefHyB3ZJPv2mETffYRd22Cgk/3zuQ6UvMfrahYyifkMMkm5A5m0TjjZ/Q4yaEj3Z4yEVPZAQle1/XUP4L4Ebe5LsD8MWGR/3T7RuX5B7lSeRe6yNtuv7cJW/3864sNyAeZh/yKSMe72/Z3sRvYnoAgwwW6UQuwG4QjwIeCVARoetBvASOAfZAI0cRtNomgHxM3wIzISv4ZMDJZLpa9N3J1xj9+XYqTIHc53PxKBEW43XK8l/twRN8BHyI+oLaVzkgbjbm83EjiO3BWcBF5K7rtHRtT+yN3FPqBFBnynuYFP7EYyHBkVV0imf303n7H9OkmuXf8Ebfrfoc0/ic6VH5hhv7ZvIIOamlb8PzrDI351mcFgsAh7rpWRWmtvq7UYnAczoWowGAxOiDHuBoPB4IQYt4zBYDA4IWbkbjAYDE6IZXHu3t7eunz58lZ179CEhMgK8CJFilisxGAwZDW7d+8O1loXTa2dZca9fPny+Pn5WdW9Q+Pr6wtA//79LdVhMBiyHqXU6bS0M24Zg8FgcEJM+gEHpEWLFlZLMBgM2Rxj3B2QihUrWi3BYDBkc4xbxgG5ePEiFy8mqbRnMBgMNzHG3QFZvXo1q1evtlqGwWDIxqRq3JVSc5VSl5RSyaZ9VcLn9sK/+5VS9TJepsFgMBjSQ1pG7r5IqtA70R7JJ14ZSVc6495lGQwGg3MSHQ1ZkRgg1QlVrfUWe2WfO9EF+FZLHoMdSqlCSqmSWut/U3iPwWDIrkRFwWuvwd69VitxOq5dh8BAcH+sNbWWjsvUvjIiWqY0ktg/nnP2fUmMu1JqMDK6p1y5chnQtcHgZCxaBFOmQFxc6m0zi9BQOHHCuv6dGE+k4s7azaXQGlTiooIZSEYY9+TkJXvTobWejb1sWIMGDUzGsrukTZs2VkswZDTffANTp8LJk3LfbjX588PcuVC8eOptDSly6hRMmgRHj8l2zx4w6M2imWrYIWOM+zmgbILtMkgVG0MmUbZs2dQbGbIP8+fDu+9CbOyd21y8eGu03rcvjBqVNdruRIUK4OVlrQYHJy4OPvkExo6V3+vy5WHePGjVKmv6zwjjvhwYqZRaCDQGQo2/PXM5e1a8YMbIZzFHjkCnThAcnL73XbsGNlvq7UaOhP/9DypWBBcTpezIHD8O/fvD1q2yPWiQ3Jh5emadhlSNu1LqR6SmordS6hxSodwNQGs9E6nJ2AGpERkBDMgssQZh/fr1gEkcdhOt0+fKiI2Fbt1g48b09RMXd/dhDkOGyBDuTuTKJS6QzL5XN2QqNhvMnAmvvgoREVCyJMyZA+3bZ72WtETLPJXKcQ2MyDBFBkNa0RqCgqB7d/jrr6zps2ZNWL0aPDzS/h4XFyhQIPM0GbIFZ8/Cc8/BunWy3acPfP65dd4tk1vG4JicOiVGPT5cTylwc0v7+wsUgKVLoUmT9PWbK5cZXRtuQ2v49lt48UUICwNvb5gxA3r0sFaXMe4GxyImRoZDo0fLdp48UKyYhBA2bmytNkOO4+JF8bgtXy7bXbrArFnZI8jIGHeD43DhAnTtCrt2yXa1arBiBVSqZK0uQ45kyRIYOhRCQqBgQRlzPPNM9rmxM8bdAWnXLqVsEE5KYCDUri2rJwFGjIAvvsg+/0mGHMPlyxLY9OOPst22rUyaZrfgNWPcHZASJUpYLSHreeEFMez58sGyZfIfZTBkMStXwvPPw7//ypz6lCkyes+OYwxj3B2QkydPAjmgaEdkpPw3hYZKCELu3BKSULiw1coMOYywMHjlFVlIDPDgg+Drm709gsa4OyBbtmwBHNy4x8bCzz/D9et3brNsGfz++63tjh2NYTdkORs3woABcPq0jC8mTZIFxK6uVitLGWPcDdbw+uuyNjs18uWTVaF58sAbb2S+LoPBTkSEXHKffy7b9etLJokaNazVlVaMcTdkHlu3wubNSfeHhYlhd3WVPCp3GgIpBU8+CY88krk6DYZE7NgBzz4LR4/K0oa33xZDn56lFFZjjLsh4/nlF/nv+Owz8ZvfiXfflf8agyGbEBUF48fDhx9KKoEaNWS0Xr++1crSjzHuhozj+nWJavH1vbWvTRto1Chp2xIlJJzRYMgm7NsH/frB/v1y0/jaa2Lo8+SxWtndYYy7A9KpUyerJSTP8OGwYIG8fuopWTE6aFD68rAYDFlMbKyM1MePlwXQlSrJaL15c6uV3RvGuDsg3t7eVkuAxYsl2iWeiAj47TcZ8nz4Ibz8cvYPJzDkeI4ckdF6/KLnESPk8s2Xz1pdGYEx7g5IYGAgAFWrVs36ziMjYfDgWyP0xMyYIck2DIZsjM0mUTBvvCGXdNmyUnjKmebujXF3QLZv3w5ksXGfPl1G68HBEBAg+555Bjp0uNWmaFFo3TrrNBkMd8GpUxK3Hh/I1b8/TJsm+WGcCWPcDclz+rSss756VYpUxKfWBXG3TJ0qCTaM68XgIGgtK0xfflnm/osXh9mzoXNnq5VlDsa4G4QdO2RCND50MSjo9nJyLi4wcaLkPy9XLnuvuzYYEnH+vIxVVq+W7Z495WY0O0xfZRbGuOdUVq6Uep3xWRZDQmRSNCHlysEPP4C7u+RMv+++rNdpMNwDWsslPHKk3IR6eYlR793bamWZjzHuOZHLl8Vffvny7fubNZP71PgUd+XKQf78Wa/PYMgAgoJg2LBbQV0dO8LXX0td05yAMe4OSLdu3e7tBKtXi2Fv2hQWLry1v1QpWWttMDg4v/wiQV1BQeDpKROmAwZkz9S8mYX5T3ZACt7LtH5UFPzxh7zu1k1G5waDk3D1qngbv/1Wth9+WEIcy5e3VJYlGOPugATYQxF9fHzS98atW6XIxY0bsm3CFg1OxJo18NxzMnmaN68sRhoxQmIBciLGuDsgfn5+QCrGPSZGAnq1lu3oaOjTRwx7vnxSbaBOnSxQazBkLtevSx6YGTNku0kTSR9QpYq1uqzGGHdnJC4O2rWDDRuSHqtfH7ZtkwgYg8HB+fNPWYR08qSk450wAUaPNlNHYIy78xEaKmViNmyQEXrp0reOFSoE331nDLvB4YmMhLFjpSyA1lI7/dtvoVYtq5VlH4xxdwa0ltH41avw5puSsxRgyRIZwRsMToSfnyT7OnxYFki/8YaUBTBjltsxxt0ZGDpU4tMT8sknxrAbnIqYGFkkPWmSeB6rVRPfenLlAgzGuDseWtPL0xOuXIF588TZOHu2VO5t3VqeJ0yAmjWtVmowZBgBATJa37tXYtVfekmMfN68VivLvlhn3AMDoVWr2/f16iX5TSIibs82GE///vIIDoYePZIeHzZM1hWfPSsrMBPzyivw+OPSd3JpaceOlZyf/v7it07M5MmyinPbNnF/JGbaNIlAWbdOhhiJmTULqlaVvOdTpyY9vmCB5B796adbU/8JWbIE5s3D47XXkh677z457uEh66tfeCFpm02b5HnKFFix4vZjefPCqlXy+r33YP36248XKXJrqd8bb4A9M+VNypQRfz7IZ+fvf/vxKlVu3V0MHizFKRNSp458fiB1Vc+du/1406bw/vvyunt3SZeQkDZtbpXsa9/+VrhnPJ06yUwbJL3uwFx7abn2vL2lylbCSlvxrFx569pbtCjp8bu89rSGo5eLUP/oz0RHw1cF3+Dp8tsptAdob2+U06+9O2BG7o6Evz+89RZnypbFKzaW/Dab7C9YMOesqTbkGG7cgMNH4FQYRCN2eWB+yL3bamWOgdLxcdBZTIMGDXR8vLYhDYSFQb16cOIEvm+9BfffT//+/a1WZTBkODab3Dy89poMZkuVgjlzzBRSPEqp3VrrBqm1S9PaLaVUO6VUoFLquFJqTDLHyymlNiql9iql9iulkrm3MNwVISHw1ltyS3/ihNxCVqxotSqDIVM4cwYefVSyOEZEyLq7gABj2O+GVN0ySilX4CugLXAO2KWUWq61PpSg2VhgkdZ6hlKqOrASKJ8JenMWWov/Nt4fmS+fJPpK7O82GBwcrcWVP2qU3KR6e8PMmeLiNtwdaRm5NwKOa61Paq2jgYVAl0RtNFDA/rogcCHjJOZgvvpKDHvhwjIJ5ucnk2IGgxNx8SJ06SJ5YcLCoGtXOHjQGPZ7JS0TqqWBswm2zwGNE7UZB6xRSr0A5AOSLTOrlBoMDAYoZ7IRpsyhQ/Dqq/L666/NlW5wShYtkkCjy5clLuCLLyRgJSel5s0s0mLck/uYE8/CPgX4aq2nKqWaAguUUj5aa9ttb9J6NjAbZEL1bgTnCL7/XtwxWksS6kSGvU+fPhYJMxgyhpAQ8avHlxN49FGZNC1TxlpdzkRa3DLngLIJtsuQ1O0yEFgEoLXeDuQBnLg6YSayfv0tw37//fDZZ0mauLm54ebmZoE4g+He+f138PERw54vn0TGrF5tDHtGkxbjvguorJSqoJRyB54ElidqcwZoA6CUegAx7kEZKdSpuXBBqgr4+IjDUWt46ikpWu3pmaT5rl272LVrlwVCDYa7JywMBg6UNT0XL0rW6X37JHuGccNkPKm6ZbTWsUqpkcAfgCswV2t9UCk1AfDTWi8HXgG+Vkq9hLhs+murAugdDZsNnn321go+kLivBQskK1IyHDx4EICGDRtmgUCD4d7ZsEE8jGfOSIaMyZOlYtIdLnFDBpCmFapa65VIeGPCfe8keH0IaJ6x0nIIn30mS8a9vWVZdoECkhHJDGUMTkBEBIwZIxOlAA0aSGreBx6wVldOwKQfsAqtJTXvGPuasLlzoXHiICSDwXHZvl1uSo8dk+IZ77wjl7uZLsoacmh1QYtZuxby55fVptHRkkjq8cetVmUwZAhRUZJb7sEHxbD7+MDOnZJbyxj2rMMY96zm6FGZLI2IkO1GjZLP0mcwOCD+/tCwIXzwgWy//rqsvatb11pdORHjlskKrl6FoCCZVRo6VPa1bClhj3cxo2QShhmyG7GxYtDHj5fX998vhTSaNbNaWc7FGPfMxGaD5ctlyV14+K39992XYjSMweBIHDkihTTio3NHjhRDny+ftbpyOsYtk1lcvgw9e0K3bmLYixeX4cxLL8GpU1IY4S7Ztm0b27Zty0CxBkP6sdng00/F5bJrl1zS69ZJZIwx7NZjRu6ZwZUrcsWfOSPbjz4KixdLmGMGcNReSaaZuec1WMSpU1IcaMsW2R4wQAx9wYKWyjIkwIzcMxqtxa9+5ozEqs+bB3/8kWGG3WCwEq2lYl3NmmLYixcXz+PcucawZzfMyD0jCQ2VTI6LFsl9qb+/uGIMBifg/Hl4/nnJAwNS+nP6dCmva8h+mJF7RvLyy5KeF8TxaAy7wQnQWhKV+viIYffykqRfP/1kDHt2xozc75VVq+DAAXkdX/X9f/8Th2QmYTJCGrKKoCDxMi5dKtsdO8r4xdRjz/4Y434vrF0LHRKVi23cGKZNy9RuTT53Q1awZAkMHy4G3tNTLusBA0zaI0fBGPd7YcIEeX7iCahUSeLWn3nGWk0Gwz1y6ZLEqi9eLNsPPyxxAffdZ60uQ/owxv1uuXED/v5bhjFz5kChQlnW9ebNmwFo2bJllvVpyBn8/LO4YYKDJf3Rxx/D4MHgYmbnHA7zld0tu3ZBTIzEhGWhYQc4deoUp06dytI+Dc7N5cvQpw/06CGGvXVrmUoaOtQYdkfFfG13y6pV8tyihbU6DIZ7ZOVKiYT54Qfw8ICvvpLppPLlrVZmuBeMW+ZusNnkPwEkxYDB4ICEhUn07pw5st28Ofj6mgheZ8GM3O+GrVtlBWrZspK02mBwMDZsEI/inDlS9u7jj2HzZmPYnQkzcr8bvv1Wnp96yhKHpIeHR5b3aXAOwsOlGtKXX8p2gwaSmrd6dWt1GTIeY9zTy59/SiINpSTPqQX06tXLkn4Njs22bVL27vhxU/YuJ2CMe3qIipI4dptN6ojVqGG1IoMhVSIjxZBPmSKpBGrWlNG6qY7k3Bife3rYswdOn4aKFWHcOMtkrFu3jnXr1lnWv8Fx2L0b6tcXn7pSMibZtcsY9pyAGbmnh7175blFC3B3t0zGuXPnLOvb4BjExMCkSTBxIsTFQZUqMlpv0sRqZYaswhj39LBnjzzXq2eZhFhbLEERQRRwN/nhDclz4ID41uPHIqNGiaE38/A5C8uMe2BIIK18W922r1eNXgxvOJyImAg6fN8hyXv61+lP/zr9CY4IpseiHkmOD2swjN4+vTkbepZnliXN8fJK01d4vOrjBAYHMmTFkCTHx7YYyyMVH8H/oj+jVo+6/aDWTD50kmbAtgq5eDORdoBp7aZRp0Qd1p1cx8QtE5Mcn9VpFlW9q/Jb4G9M3T41yfEF3RZQtmBZfgr4iRl+M27uvxF7gzy58jCr4yyGrxxOdFA0JzjBJ19+Qsn8kp4v1hbLmmfW4OHmwfRd01l0cFGS82/qvwmAKdumsDxwOdeirlEgdwGUUuR1y8uqPrIw673N77H+1Prb3lvEowg/9/oZgDfWvcH2c9tvO16mQBm+e+I7AEatHoX/Rf/bjlcpUoXZj88GYPBvgzkacvS243VK1GFaO0m41ndpX86F3X530rRMU95/5H0Aui/qTkhEyG3H21Row9st3wag/fftuRFz47bjnap0YnSz0QBJrjvI5tceMLnNZJqVbca2s9t4c/2bSY5PazeNmkXrMOTDdcw9PhFdG3I3hmpVYW8hOBsxi6oe6b/24lnSawneHt74+vvi6++b5PjKPivTfO2tOLritmPm2ru3a+9OmJF7Wjn9D5w7J7Ht1arBX5nfZZyOIzA4kKCIIDzdPWk1vxX/hf/HQzyERnM05CjB4cG4uLgQHBFMn6V9mNx6MievnORoyFHCosKoVLgShfMWvu28MbYY/C/6cy36Gvnc8vGA9wPkdcub+X+QIdM4fRqGdYMdl4AWkpI3PpedIWeitNaWdNygQQPt5+dnSd/p5q+/oGVLCTXYuFFeZyB+F/wYtXoUzcs2Z/zD49l5ficrj63k18BfORJ85La2zcs2Z2i+oVwKv8TEoIlcibyS6vmHNRjGR20/Ir97fs6FnWPL6S30WXorbbCbixtD6g+heP7i9K7Rm8pFKmfo32fIPGw2iVkfM0Zy2ZUuDd98A+3aWa3MkFkopXZrrRuk2s4Y91QIDYXatWVoNGYMvP9+qm+Jjovm3Y3vMn/ffFxdXLkaeZWu1bryyaOf4JXXi1NXTzF121SeeOAJLly7wJAVQ4iKiwLkFjPhbWGVIlWY33U+iw8upkT+ErzU9CVyucgN14VrFxi1ehShUaGMaT6GCVsmsOmfTQBUKlyJntV7MnX7VGJsMVQsXJG2Fdsya/esm+d+p8U7XAq/xMzdM2/uy5srLx8+8iEjGo3ARZlgquzMP/9IfvVNm2T7mWfgs8+gcOGU3mVwdIxxzyhee03iyOrVg+3bb4uSORZyjD5L+5DfPT8zO83EVbnywV8fsOr4Ks5fO5+ubp6p9Qy7Luy6baTeu0ZvZnWaRcE8aas8bNM2joUco0T+Eni4eeDm6sb+//bTb1k/9v23L0n7wyMOU827Gn8c/4ORq0Zy/PLxm8dK5i9JJa9KDKw7kGdrP4syFRqyDVrL6Pzll+H6dShWDGbNgq5drVZmyAqMcc8I4uLEx/7vv5JPplmz2w63+bYNG05tAGTEWzx/cf65+g8AuV1zU79UfQrmLkjhvIU5GnIUvwu3/t4mZZqw+8JuAL7q8BWD6g/iRswNfP19aVi6IQ1K3fm7W22vUNwujffe0XHRTNwykdXHVzO+1Xh2/7ubPLny8ErTV5IY7WWHlzFkxRCCIoJu7utYuSMvNHoBN1c3WldonaY+DZlD4iLV3bvDjBlQtKi1ugxZR4Yad6VUO+AzwBX4Rmv9QTJtegHjAA3s01o/ndI5HcK4z50LAwfKoqXjx2+rL3Y9+jqFPyxMrC2WthXbsvbk2pvHHqv0GPO7zqd4/uI399m0jUUHFxEdF03hPIXpWKUjZ0PGUMRhAAAgAElEQVTPEqfjqFi4Yrpk+fr6AtA/k+q0BoUH8cb6N1h7ci2Xwi8RGRt581iXql2oWawm566do7RnaUY3G02hPFmbzz4nEl+k+oUX4OpVcb189RU8+aQpe5fTSKtxR2ud4gMx6CeAioA7sA+onqhNZWAvUNi+XSy189avX19na44f1zp/fq1B6/nzkxxeEbhCMw7d+OvGWmutlx1epuvOrKtn7pqZ6dLmzZun582bl+n9aK31udBzuv137TXjSPZR5pMyeu2JtVmiJafy339ad+smlyJo3bGj1ufPW63KYBWAn07Fvmqt0xQK2Qg4rrU+af/VWAh0AQ4laDMI+EprfcX+g3EpDefNvsTGQt++4tDs1SvZuqhz9koS7A6VJS61a7WudK3mfE7P0gVKs7LPSiJjI7lw7QJDVwxl7cm1eLp7ci36GufCztF2QVuGNxjOwxUeZsy6MZy4coJ6JevR/v72lPIsxaB6g3BzNdmp7oaEZe9MkWpDekiLcS8NnE2wfQ5onKhNFQCl1FZkpD9Oa7068YmUUoOBwQDlypW7G71Zw6pVsGMHlCkDM2cm+U86eeUkvxz5BTcXNwbVG2SRyKwlT648VCxckTXPrLm5L9YWy4d/fcj4zeOZ7jed6X7Tbx7b8+8e9vwrK3rn7J3Dt12/pUYxk2gtrVy+LC6Y+JowrVuLl9AUqTaklbTEuiU3RkjsqM+FuGZaAU8B3yilkjhitdaztdYNtNYNimbnGaC1dv/5888niSuzaRsTNk9Ao3nS50lKepbMcnlFihShSJEiWd5vYnK55OKtFm+xc9BOahariULRtVpXxrcaz/N1nye3a25ADH292fX4eOvHxNniLFad/Ulc9u7LL+WSNIbdkC5S89sATYE/Emy/AbyRqM1MoH+C7fVAw5TOm6197tWri3Nzy5bbdttsNt1zUU/NOLTreFft/6+/RQKzH7FxsTooPCjJ/tDIUD1o+aCbPvrmc5rrYyHH9PWo63re3nn6bOhZC9RmT0JDtR448JZvvVkzrY8etVqVIbtBGn3uaRm57wIqK6UqKKXcgSeB5Yna/AI8DKCU8kbcNCfv8XfHGhYtgkOHxMHZ+Hbvk/9FfxYfWoynuycrnl5B7RK1LRKZ/XB1ccXbwzvJ/gK5CzD78dn8/vTvlMxfkq1nt1J7Zm3qza7HgF8HUGN6DXz9feMHBTmW5MrebdkClc1iYcNdkqpx11rHAiOBP4DDwCKt9UGl1ASlVGd7sz+AEKXUIWAj8KrWOiT5M2ZzJtoTfn3wQZK0vn+f/xuAzlU70+5+69Z3//bbb/z222+W9X83dKjcgYDhATxd82kiYiI4GnKUgrkLEhYVxoBfB9D1p65cvH7RaplZTni4+NbbtJGyvPXrS/LR0aNNXhjDvZGmxGFa65XAykT73knwWgMv2x+Oy4ED8vDyEn97Inae3wlAo9KNslrZbYSEOObvpldeL75/4nt6Ve/Frgu7eLXZq/wa+CsvrHqB5YHL2XpmKzM7zaRH9bRnvnNkTNk7Q2Zikock5Pvv5blnzySj9u1nt/Nr4K+A9cbd0elSrQsTW0+kYJ6C9Kvdj4BhATxS8RFCboTQc3FPnv75aS7fuJzkfTFxMcTZ4giJCOFI8BFOXTl1c0WwIxEZKVktHnxQDLuPD+zcCW+/bQy7IeMwKX/jiY6+FXfWp89th2bvns3IlSOJscXQtmJbGpZqaIFA56VswbKs6buGmX4zGb12ND8G/MimfzbxcduPcVEudKzSkQP/HaD7ou78F/5fkve7KldalW/F5+0/p3rR6hb8BWln926pq37oELi4wOuvS8XG3LmtVmZwNoxxj+edd+DsWZnBat785u7pu6YzYuUIAF5s9CJTHp2Cq4txhmY0SimGNRxG20pt6f9Lf7ae3UrfZX0BKFewHHG2uGQNO0je+/Wn1lNvVj0mt5nM/xr/L9t9R9HRMHmyKXtnyDqMcQ8LkxUiu3fLUGrePHkGomKjmPznZACmd5jOsIbDrFR6kxIlSlgtIdO43+t+NvffzKc7PmXshrFExUVxJvQMAKU9S/NF+y8oU6AMXnm9cFEu/HP1H77b/x2nQ0+z/tR6XlnzCr8c+QXfrr7pztmTWezZI6tK9++X7f/9Twy9KXtnyFTSEi+ZGY9sE+c+YsStwOJJk27uvhB2QTf9pqlmHLr6V9W1zWazUGTOJDw6XEfFRulxG8fpUlNL6SUHl6TY/rfA33SJKSU049D5JuXTM3fNtPR7i4rS+u23tXZ1lcurYkWtN260TI7BSSCNce45O+Wv1lCiBFy6JEHFDz0EwH/X/6Pe7HpcuHaBsgXKsvyp5dQpUcdarYY0ERIRwoiVI/jp4E8APFrpUeZ0nkOZAmWyVMeBA+Jb9/eX7BUvvCCj9Xz5slSGwQlJa1bInB0tc+SIGPbixSV0wc6PAT9y4doF6pesj99gv2xn2JcuXcrSpUutlpEtKeJRhIU9FrKw+0K88nqx5sQafKb7sGDfgixZKBUbK8W66tcXw16hglRm/OwzY9gNWUvONu6bN8tzy5a3JQeLD3l8uenLFMtXzAplKRIWFkZYWJjVMrI1vX16c3D4QTpV6URoVCj9fulH90XduRSeeQlLAwNljPDmmxATA0OGwL59GV5y12BIE8a4A7RqdXPX17u/ZtM/m3BVrpauQjXcOyXyl2D5k8uZ23kunu6eLDuyjBrTa7D08FK01ti0LUP6sdkkFW+dOvD331KkevVqSSjq6ZkhXRgM6SbnGnetb1UWtg+tbsTc4M0NbwLwwSMf4JXXyyJxhoxCKcWAugM4MOwArSu0JjgimO6LuuMywYXy08qz6tiqezr/qVMSbPXSS7I4qV8/CAiAxx7LoD/AYLhLcq5xP3wYLl6U4pMPPADADwd+IDgimHol6/FK01csFmjISO4rdB9rn1nLF+2/IG+uvACcDTtLhx86MOS3IVyLupau82kNs2dLsq/Nm6VI9S+/SOx6IVN10JANyLnGfeFCee7UiWvR1wkKD2Lq9qkAvNTkpSSFo7MTZcqUoUyZrI3+cAZclAsjG41k/7D9TO8wnXdavIO7qzuz98ym1sxabP5nc5rOc+4ctG8vPvXwcMlWcfAgdOmSyX+AwZAOcm4o5AMPwJEjrF/yEU8cm0hYlExQlitYjmMvHMPd1T2VExicgYBLAfRb1o+9F/eiUIxqMopJrSeR1y1vkrZaw4IF8OKLEBoq+eWmT4fevS0QbsixmFDIlLh0ScIgPTwY9d/8m4bdp5gPG/ptMIY9B+FTzIcdz+/gnRbv4KJc+HTHp9SdVfdmBtB4/vsPunWTLI6hodCpk/jWjWE3ZFdypnH/6y8AzrWoQ0DQQfLkysPGZzey8/mdVPKqZLG41Fm0aBGLFi2yWobT4O7qzviHx7Pj+R084P0AgSGBNJvTjLc3vE10XDSLF0ONGvDrr1CggGSoWL4cSmZ9hUWDIc3kPONus0lRSmB1E6lD+lilx2hVvlWyt+LZkYiICCIiIqyW4XQ0KNWA3YN380rTV7BpGxP/nEjxsY3pNfIAISHwyCOy8rR//yQ10w2GbEfOM+47d8qSQW9vVleUOGcTz26IJ69bXqY8OoX3q2zGNbQiV/P4w5D6dPn4A1atjqNcOasVGgxpI+cZd39/AGI6tGPt+T8BGbkbDCD+9OeegzFPP0TcV/socW4ouMbwa/gblPm0NE2+acL0XdMzbAGUwZBZ5DzjfuAAAKsfcCMsKoxq3tWoULiCxaIM2YF16yRufd48KZ4x9f38nJs5g9V9VlPaszT/hf/H3+f/ZsTKETzy7SMOWQXKkHPIecbdnlT7izz7ABhUb5CVau6KChUqUKGC+UHKKMLDYcQIaNtW6rU0bAh798LLL0uR6sfuf4yA4QGMaDiCSoUrkc8tHxv/2UitGbWYs2dOliQkMxjSS86Kcw8Lg+LFuWaLxGtsLmzaRtCrQSbNQA7mr79kgvTECalf+u67UvouVwplbILCgxj6+1CWHpbMnB0qd+Drx7+mlGeprBFtyNGYOPfkWLwYIiNZ93gNYm2xNCrdyBj2HEpkJIweDS1aiGGvVUvm2t96K2XDDlA0X1GW9FzC9098T6E8hVh5bCU+031YGLDQjOIN2YacY9zfeQeef57Q3DCiznnAcSdSv//+e77//nurZTgsu3ZBvXowdaqENL71luyrk460/Uopnq75NAHDAmh3fzuuRF7hqZ+foveS3gRHBGeeeIMhjeQM4x4TAx98AMDGLrX4N+4q5QqWY1STURYLuztiYmKIiYmxWobDER0Nb78NTZtK3rhq1WD7dila7X6Xi5JLFyjNyqdXMrvTbPK752fxocXUmF6D5YHLM1a8wZBOcoZxP3pUDLyrK/6DOwPwZI0nKZTHpO/LKezfD40aiSG32WSydM8e2XevKKUYVH8Q+4fup+V9LbkUfokuC7sw4NcBhEaG3nsHBsNdkDOMuz38kU6d2Bsk0TJ1S9a1UJAhq4gve9eggVRFqlhRUvROnQp5M3hBcoXCFdjw7AY+fexT8uTKg6+/LzVn1GS+/3zm+88nPDo8Yzs0GFIgZxj3bdsAiKr5ANvOyuu6JYxxd3aOHIHmzW+VvRs2TAy8vQ56puCiXBjVZBR7h+ylUelGnA07S/9f+9P/1/7UnlmbrWe2Zl7nBkMCnNu4X70Kv/8OX33Fx80gT64PCI4Ipnbx2lQpUsVqdXdNlSpVqFLFcfVnNjYbfPop1K0rETBlysCaNZKeN3/+rNFQzbsaW5/bysSHJ+KqXAE4ceUED817iNfXvk5kbGTWCDHkWJw3zn3nTmjWDOLiiHEB93duHVrYfSG9fUyuVmfk5EkYMAC2bJHt/v3F0FtZHSk6LhqtNRM2T+CDrR9g0zZqFK3Bt92+pV7JetYJMzgkJs79jz8gLg4KFODI4G43dxvD7pxoLQWpa9USw168uKTonTfP+rJ37q7u5M6Vm0ltJrHtuW1UKVKFg0EHafxNY8ZvGk9MnIl8MmQ8zmvcDxzgmjvozz5j79CuADzxwBNOYdh9fX3x9fW1Wka24cwZaNdOfOrh4VJA4+BB6NzZamVJaVymMXuH7OV/jf9HrC2WcZvH0XROUzae2siqY6uIs8VZLdHgJKTJuCul2imlApVSx5VSY1Jo10MppZVSqd4yZDY7zv9N4THQ+vpXfLL9E8BMojobNhvMmCGFNNasgSJF4KefpDxukSJWq7szHm4eTGs3jQ39NnBfwfvY/e9uWn/bmg4/dCDXe7ko8lERpu+abla7Gu6JVI27UsoV+ApoD1QHnlJKVU+mnSfwIvB3RotMN5GRrM59hjgX2BTix77/9nFfwfsYUGeA1coMGcTx4/DwwzB8OFy/Dt27S9m7Xr2sVpZ2Hq7wMPuH7ef5us/ftv/yjcuMWDmCx757jLOhZy1SZ3B00jJybwQc11qf1FpHAwuB5Oq8vwd8BFgfBnDqFP7F5aWHmweD6g3Cf6g/pQuUtlaX4Z6Ji5MY9XjferFikjJoyRIoUcJqdemnQO4CfN35a4JeDSL41WA+euQj3m35LkXyFmHtybX4zPBhvv98M4o3pJu0GPfSQMLhwzn7vpsopeoCZbXWK1I6kVJqsFLKTynlFxQUlG6xaeb4cfba/9H9Bvkx+/HZZjWqE3DwoARAjR4NN25A375w6BD06GG1snvH28ObIh5FeLX5q4xrNY6Dww/SuWpnwqLC6P9rf7r+1JWL1y9aLdPgQKTFuCdXLfLmMEIp5QJ8CryS2om01rO11g201g2KFi2adpXpJPTofs4Ugjza1aHj2e9EjRo1qFGjhtUysoxr1yRdQJ06t+LWf/8dFizI3r71e6F4/uL80vsX5nedT4HcBVgeuByf6T4sObTEamkGByEtxv0cUDbBdhngQoJtT8AH2KSU+gdoAiy3clL16Om9AFRxLY6ri6tVMjKNhg0b0rBhQ6tlZAkbN0p1pE8/FZfM0KHiW+/QwWplmY9Sin61+xEwLIBHKj5CyI0Qei7uydM/P83lG5etlmfI5qTFuO8CKiulKiil3IEngZsp77TWoVprb611ea11eWAH0FlrncWVOG4RGBIIQJUCzlmtKCdkhQwPhxdegNat4fRpSdHr5yfRMQULWq0uaylbsCxr+q5heofpeLh58GPAj/hM92HlsZVWSzNkY1I17lrrWGAk8AdwGFiktT6olJqglMqGkcRwNPpfAKoWTxLU4xQ4ez73rVvFBfPll1I4Y/x42LFDDHxORSnFsIbD2Dd0H83LNuff6//S8YeODFo+iLCoMKvlGbIhaYpz11qv1FpX0VpX0lpPsu97R2udJGm11rqVlaN2tOao61UAqpSvb5kMQ/qJjIRXX5XEXsePiztm506ps+LmZrW67MH9Xvezuf9mPm77Me6u7nyz9xtqzajFxlMbrZZmyGY43wrVkBBOFpBVfhVL5ZxJR0dn505J9DVlilRHevNNqY5U16w7S4Kriyujm41mz+A91C9Zn9Ohp2n9bWtGrR5FREyE1fIM2QTnM+5nznDa7pMtX6i8pVIMqRMVJWXumjWTFL1Vq0qG5kmTIHduq9Vlb2oUq8H2gdsZ32o8uVxy8dnfn1F3Vl12nNthtTRDNsDpjPuNU0e5lB9y2RQl85e0Wo4hBXbvlkpIkyffqo60dy80bmy1MsfBzdWNd1q+w46BO6hRtAZHQ47SfG5z3lr/FlGxUVbLM1iI0xn3M8d2A1BWezplGCRAnTp1qJOeas7ZjPjReuPGUv4uM6sj5RTql6qP32A/Xmv2GlprJv81mUbfNGLfxX1WSzNYhNMZ99Mn9wBQPq/zjtod2bj7+UH9+rdG66NGiYHPzOpIOYU8ufLwYdsP+XPAn1QqXIn9/+2n4dcNmbRlErG2WKvlGbIYpzPuJ4Ikxr289/0WK8k8IiIiiIhwrImzqCgYOxaaNJE0ApUrw59/yuKkfPmsVudcNC/XnH1D9zGi4QhibDGM3TiW5nObcyT4iNXSDFmIcxn3mBj8bRLjXrNyc4vFZB6LFi1i0aJFVstIM3v2SIHqSZNktP7SS+DvL/VNDZlDPvd8fNnhS9Y+s5ayBcqy8/xO6s6qy7Qd07Bpm9XyDFmAcxn3o0fZW1wu3Lrlm1osxhAdLTHqjRpJyoD775dMjp98Ah4eVqvLGTxS8REODDtA/zr9iYyN5KU/XqL1/NacunLKammGTMapjHvsfn8OFJPXdUo4pk/aWfD3h4YN4b33ZLT+v//Bvn3w4INWK8t5FMxTkHld5vHrk79SPF9xNp/eTK2Ztfh699cmlbAT41TG/UjAJiLdoIIuZFL8WkRUFLz9thj2+EiYTZtg2jQzWreazlU7EzA8gB7Ve3A9+jqDVwym4w8duXDtQupvNjgcTmXc957bBUDdAs6X5tcR2LZNVpROnAixsTBypBj4Fi2sVmaIx9vDm0U9FvFj9x8pnKcwq46vwme6Dz8c+MGM4p0M5zHusbHsvXIYgDqVnHumrkGDBjRoYHmZ2ptERMgCpAcfhMOHZZXpn3/CF1+YSJjsiFKKJ32eJGB4AB0qd+BK5BX6LO1Dz8U9CQrPxCI6hizFeYz73r3sLBoNQN0HWlssJnPx8fHBx8fHahkA/PWXZHD89FNwcYE33hB/u/GtZ39KeZZixVMr+Obxb8jvnp+fD/+MzwwffjnyC1cjr5oVrg6O0xj3y5tWsb0M5NKKFvc5tx8gNDSU0NBQSzVEREhIY4sWcOwY1KghaXknT4Y8eSyVZkgHSikG1hvIgWEHaFW+FZfCL9Htp24U/rAwlT6vxJoTa6yWaLhLnMa4rz67EZsLtHSvQoHcBayWk6ksW7aMZcuWWdb/X39B7doySeriIqkEdu+WWHaDY1K+UHnW91vPZ+0+I08u+XU+f+08j333GMN/H8716OsWKzSkF6cx7rsijgHQumQzi5U4L9evw4svymj9+HHw8ZHR+sSJJoOjM+CiXHix8YsEjgxk+8DtTGo9CTcXN2b4zaD2zNr8efpPqyUa0oHTGPejOhiAByo2sliJc7JunRTP+OKLW6N1Pz8zWndGyhUsR5MyTXjzoTfZNWgXtYrX4uSVk7T0bcnoNaOJjI20WqIhDTiHcY+I4Gg+mfypUsWsTM1IwsJg8GBo2xb++UcmT3ftMqP1nELtErXZNWgXbz30Fkoppm6fSr1Z9fC7YF2xNUPacArjHn3sCKcKg9JQqWhVq+U4DevXy2j966/B3V1yw8RXTDLkHNxd3ZnYeiLbnttG1SJVORx8mCbfNOHdje8SE+fchdodGacw7qcObSPOBe6LzntzMsiZadq0KU2bZt4dyvXrMHw4PPIInDkjKXr37JHSd6aWac6lcZnG7B2yl1GNRxGn45iwZQKNv2lMwKUAq6UZksEpjHvgP3KLWNWlmMVKsoaqVatStWrm3KFs3gy1asGMGWLI33sPtm+XUEeDIa9bXj5t9ykbn91I+ULl2XtxL/Vn1+ejrR8RZ4uzWp4hAU5h3I8GSZ7qKp7lrRWSRQQHBxMcHJyh5wwPl+RerVrBqVO3fOtjx5rRuiEprcq3Yv/Q/QyqN4jouGheX/c6LXxbcPzycaulGew4h3EPPwNAleLVLVaSNaxYsYIVK1Zk2PniV5l+/jnkygXvvgt//y2x7AbDnfDM7cnsx2ez8umVlMxfkm1nt1F7Zm2+2vmVyRmfDXAO404IAFUqmTDI9HDjBrzyyu1x63//DePGyQSqwZAW2lduT8DwAPrU7ENETAQjV43kse8e40zoGaul5Wgc3rjroCACCklOmWo+rawV40Bs2CBRL598AkrJZKmfH9SrZ7UygyPildeL7574jsU9F+Pt4c26k+uoOaMmvv6+JtukRTi8cT+/eyMhHlA42pWyhe6zWk625/x56NIF2rSBwEB44AFZZTppkolbN9w7Par3IGBYAF2qdiEsKowBvw6gy8IuXLx+0WppOQ6HN+57A9YBUNdWHKWUxWqyL1qDr69EvSxfDp6eYtD37JHCGgZDRlE8f3GW9V7G/K7zKZi7IL8d/Y0a02uw6KDj1P11BhzeuO+7tB+AOp6VLVaSdbRo0YIW6aiAcf48dOoEAwZAaCh07AhHjogrxmRwNGQGSin61e7HgWEHaFuxLZdvXKb3kt489fNThESEWC0vR+Dwxv3kDSkRViUHrUytWLEiFStWTLVdwtH6ypVQqBB8+y389huUKpX5Og2GsgXL8kffP5jeYToebh4sDFiIzwwffj/6u9XSnB6HN+6n9RUAypfOOatsLl68yMWLKfswz5yREXr8aL1TJzh4EJ55RiZQDYasQinFsIbD2D90Pw+We5CL1y/S6cdODPx1IGFRYVbLc1rSZNyVUu2UUoFKqeNKqTHJHH9ZKXVIKbVfKbVeKZVlM5v/uEcAcF/FnBPmsXr1alavXp3ssbg4ydxYvTqsWnVrtL58uRmtG6ylklclNj27iSltp5DbNTdz/edSc0ZNNpzaYLU0pyRV466UcgW+AtoD1YGnlFKJVwvtBRporWsBS4CPMlpocsSFhXI2vyyWKFehTlZ0ma05dEjK2734oqw47dFD9pnRuiG74OriyivNXmH34N3UL1mfM6FnaPNtG15c9SIRMRFWy3Mq0jJybwQc11qf1FpHAwuBLgkbaK03aq3jv5kdQJmMlZk8/wb6EeMKRSNd8cidPyu6zJbExsKHH0rc+o4dMkJftgwWL4aSJa1WZzAkpUaxGmwfuJ3xrcaTyyUXX+z8gjoz67D97HarpTkNaTHupYGzCbbP2ffdiYHAquQOKKUGK6X8lFJ+QUH3XmV9/87fAKgcV/Cez+WoHDoEzZvDmDEQHQ0DB8q+rl2tVmYwpIybqxvvtHyHv5//mxpFa3Ds8jEenPcgb6x7wxTnzgDSYtyTu6FPdsmZUqov0AD4OLnjWuvZWusGWusGRYsWTbvKO7DuxFoAHvaqf8/ncjS0ltF6vXqSY71MGfGxf/MNFMy5v3UGB6ReyXrsHryb15q9htaaD7Z+QMOvG+J/0d9qaQ5NWoz7OaBsgu0ywIXEjZRSjwBvAZ211lnys7vRdgKAR+o8kRXdZRsqVWrDwoVtGDMGoqJktB4QAO3aWa3MYLg7cufKzYdtP+Sv5/7ifq/7OXDpAA2/bsjELROJtcVaLc8hUanlfVBK5QKOAm2A88Au4Gmt9cEEbeoiE6nttNbH0tKxp2cDXb/+7aW6evWSIhEREdChQ9L39O8vj+BgmSzcenITsS7QrGQj3HJ7MGwY9O4NZ8/KJGJiXnkFHn9clt0PGZL0+NixUqDC3x9GjUp6fPJkaNYMtm2TBUCJmTZNsiuuWydl6BIzaxZUrSpx5lOnJj2+YAGULQs//ST51BPz/fcwdy5MmCB+dnd3OZ+XlxxfuRI8PGD6dFiUzGLATZvkecoUSJxUMm9eGfmD5HBfv/7240WKwM8/y+s33pAc7wkpUwa++05ejxoln2FCqlSB2bPl9eDBcPTo7cfr1JHPD6BvXzh37vbjTZvC++/L6+7dISTROpg2beDtt+V1+/aSFC0hnTrB6NHyulUrkpDeay8xzn7tLVkC3t6ybsLXN+nxjLz21qyL4+SVk1wIOw9AYS8b29aUopp3NXPt9YDNm9VurXWq1YtzpdZAax2rlBoJ/AG4AnO11geVUhMAP631csQNkx9YbE8BcEZr3Tm1c98L2hZHrP2+w809b2Z2lS0IDZUL4/hx8PIKIU+efFSokIdcqX6DBoNj4apcqexVGW8PbwKDj3Al8gJ1Z3VkcuvJaD2K5D3FhsSkOnLPLBo0aKD9/O6+yO6/R3dT6scGFItw4b8PnbcCzOXL8NprMGeObFepAsOG+VKoEPTv399SbQZDZhMaGcpLf7zEPP95ALS4rwW+XXypULiCxcqsQ6m0jdwddoXqpQtS8aVYjHMmHtda3PrhaokAAA8aSURBVDDVqolhd3eXIhr79snCJIMhJ1AwT0HmdpnLr0/+SvF8xdlyegs1Z9Rk9u7ZJpVwKjiscQ+6dAqAotr5XDL//COTo337QlAQtGwpRn3cOJPoy5Az6Vy1MwHDA+hZvSfhMeEMWTGEDj904LzdL29IisMa90shUuWlmIunxUoyDpsNvvpKKiKtWSMTpXPnwsaNMoI3GHIy3h7eLOq5iIXdF+KV14vVx1fjM8OH7/d/b0bxyeCwxj0o9F8Airo7h4/i+HFo3RpGjpTUAT17wuHDkvjLpA4wGG7R26c3AcMC6Fi5I1cjr9J3WV96LO5BUPi9L4x0JhzWuF8KvwRAsbzeFiu5N2Jj4eOPoVYt2LwZihWTsLNFi+R1crRr1452JqjdkIMp6VmS3576jTmd5+Dp7snSw0upMb0Gvxz5xWpp2QaHNe5BkRJsWtSzhMVK7h4/P6mC9NprEhvbp4+kDujePeX3lShRghIlHPfvNhgyAqUUz9V9jv3D9vNw+YcJigii20/d6LesH1cjr1otz3Ic1rhfig0FoFjhLMlRlqFcvw4vvQSNG8uCi/LlZRHHd9/JYqHUOHnyJCdPnsx0nQaDI1C+UHnW9VvH5+0+J2+uvCzYvwCf6T6sObHGammW4rDGPUiHA1C0SDmLlaSPNWukMtK0aeJLHz06/akDtmzZwpYtWzJPpMHgYLgoF15o/AL+Q/1pUqYJ56+d57HvHmPYimFcj75utTxLcFjjfsk1EoBiJVIvN5cduHpVcsA89phUSapXD3btEn97vnxWqzMYnIMqRarw54A/eb/N+7i5uDFz90xqz6zNn6f/tFpaluOwxj3IPQaAomWyf+3UFStktD53LuTODR98AH//LfnXDQZDxpLLJRdjHhyD32A/ahevzckrJ2np25LRa0YTGRtptbwswyGNe1R4GKF5IFccFCqeZRX90s3Fi5JM6vHH4cIFSUDk7w+vv47JCWMwZDK1itdi56CdjH1oLC7Khanbp1JvVj38Ltx92hNHwiGNe/B5SevmHemCi4urxWqSYrNJXvUHHpCQRg8P+OQT+PNPsxjJYMhK3F3dea/1e2wbuI1q3tU4HHyYJt804d2N7xIdF221vEzFIY37pQuSVbhobPbLK3PkCDz8MAwaJH729u3h4EGJjnHNoN+hTp060alTp4w5mcGQA2hUuhF7Bu/h5SYvY9M2JmyZQJNvmhBwKcBqaZmGQxr3kGCp+lfUln3yysTGii+9Th3YskUWIC1cCL//LqGOGYm3tzfe3o69eMtgyGryuuVl6mNT2fjsRioUqsDei3upP7s+H/71IXE258ss65DG/fJVST3g5eJhsRLhwAFo0kSKWERFwXPPSeqA3r0zJ3VAYGAggYGBGX9igyEH0LJ8S/YN3ceQ+kOIjotmzPoxPDTvIY6FpKnOkMPgmMY97D8AvHJZmzQsPFzS8NavD7t3Q7ly8McfkqI3vjpSZrB9+3a2Jy5HYzAY0oxnbk9mdprJqj6rKOVZiu3ntlN7Zm2+3PklNm2zWl6G4JjGPTwYAK/c1iQNs9mk1FjlylLyLiZGyqwFBMCjj1oiyWAw3AXt7m9HwLAA+tbqy43YG7yw6gXaLmjL6aunrZZ2zzimcY+8DIBX3kwcHt+BrVvFBTNgAPz7r+SG2bxZakd6Ok/2YYMhx1A4b2EWdFvAz71+pqhHUTac2kDNGTWZt3eeQ6cSdkzjHh0GgFf+olnW56FDUsD4wQdlZWmpUpILZscOaNEiy2QYDIZM4okHniBgeABdq3XlWvQ1nlv+HJ0Xdubfa/9aLe2ucEzjHnsNgCIFS2Z6X9euwauvQu3asH69lLh7+22pYt+nD7g45CdoMBiSo1i+YizttZQF3RZQMHdBVhxdgc8MHxYdXGS1tHTjkKYpREcA4FW4VKb1oTX8+KMsOpoyBeLiYOhQOHFC/Oz582da16nSrVs3unXrZp0Ag8GJUUrRt1ZfAoYH8GilR7l84zK9l/TmySVPEhIRYrW8NOOQxv2ySxQAXkUyJ93vzp3ifnn6aUkb0LCh7JsxI3OjYNJKwYIFKViwoNUyDAanpkyBMqzus5qZHWeSzy0fPx38CZ8ZPqw4usJqaWnCMY17Lkka5lUsY/PKnD8P/fpJnvVt22Qh0tdfi1+9QYMM7eqeCAgIICDAeVfWGQzZBaUUQxoMYf+w/TxU7iEuXr/I4z8+zsBfBxIWFWa1vBRxOOOubTYu55Y41MLFy2fIOePi4LPPoGpVWLAA/t/e/cdWVZ9xHH8/9AdQlA4KgiKIBEnoqqFaiGVmgqBBYkAdKxCMbhQnzGEUTZwYyQIauxlqghKFQTdZguAWM+omgcmPQZBKr/aCxR8DAZHJRrHQDKu1Hc/++F6WplDuob33nHtun1fScG7vKf083Nunh+855/vNznaTex04AHPmpN64eiQSIRLpGpMfGZMKhvUZxrYHtrH0jqV0z+hORbSC61+5nq2HtwYdrV0p1rbia2w4yXeZ0LMZevbu/BjJli3uSP3RR91NSffc4+4uLSuD3r0TENgYkxYyumWwoHgBNQ/VUHRVEUcbjjJhzQQe2fgIjc2NQcc7T+iae/2/DgPQt6lz0auq3KWNEye6u0sHDYING+DNN2FYONb/MMYEYGT/kbw7+10Wj1tMZrdMXtrzEqNeHcXuL1LrrvHwNfc6d+dYXgdnhIxG3fzqxcXuqD03F557zl3aOGVKIpMaY9JVVkYWz9z6DHvm7KHgigIO1B/glt/dwlPvPEVTS1PQ8YAwNvevjgHQV3tc0tedPu2m4S0sdCsj9eoFCxfC4cPuT1vqzhhzqQqvLCTyYIQnf/AkAGW7yij6bRE1x2sCThbC5v5V/T8B7zNCNjfD88+7Sb1WrXInSx97DA4dckfsffokM21ylJSUUFJSEnQMYwzQPbM7ZRPL2PnTnQzvO5zaE7WMWTWGJX9fQsvZlsByha651/8nNiNkRvyJXN5/312jvnChu9N0/Hg3LFNe7i5zDKucnBxyclJjumNjjDN28FiiD0WZP2Y+LWdbWLR9EWNXj+Xjuo8DyRO+5n7m3IyQF76Jp7ER1q6FSZNcY9+71y2WsXkzbN3qlr4Lu2g0SjQaDTqGMaaNXtm9WHbnMrbcv4UhuUOo/rKawhWFlO8u930qYU/NXUQmicinInJQRH55gee7i8j62PPvicjQRAc9p/6b82eEVHVXv5SWwoABbs6XTZsgK8sNwdTWwu23JyuR/6y5G5Pabrv2NvbN3cfsUbNp+m8Tj29+nPGvjefQqUO+ZYjb3EUkA1gO3AnkAzNFJL/NbqXAKVUdDrwI/DrRQc852dQAQObZ/nzwATz7LOTnu6tfKirgzBk3Je/LL7upA8rL7WSpMcZ/uT1yWT11NW/NfIuBlw1kx+c7uOGVG1gRWeHLVMJejtzHAAdV9ZCqfgesA6a22Wcq8Fps+0/ABJFkLDAHn51wM0K+8fpAbrrJzdD4ySfQvz888YTb3r0bHn4Y8vKSkcAYY7y7a8Rd1M6rZfr3p/N189fM/etc7l5/d9IbvJfmPgj4otXjY7HPXXAfVW0BGoDzWquI/ExEIiISqaur61DgbLLJ/Ubo1fMqCgrg3nth40Y3L8wLL7gpBIwxJpXk5eSxbto61v1oHX179qX46mKSdPz7f5ke9rlQgra/crzsg6quBFYCFBUVdejX1t/WHHEbZR35amOMCc70gumMGzqOvJzkDyt4ae7HgMGtHl8NfNnOPsdEJBPIBeoTktCcZ9asWUFHMMZ00IDLBvjyfbwMy1QD14nItSKSDcwAKtvsUwk8ENueBmzVMC8+mOKysrLIysoKOoYxJoXFPXJX1RYR+QWwCcgAKlR1v4gsBiKqWgmsBv4gIgdxR+wzkhm6q6uurgZg9OjRAScxxqQqL8MyqOrbwNttPreo1fa3wI8TG820Z//+/YA1d2NM+0J3h6oxxpj4rLkbY0wasuZujDFpyJq7McakIQnqikURqQM+7+CX9wNOJjBOGFjNXYPV3DV0puZrVLV/vJ0Ca+6dISIRVS0KOoefrOauwWruGvyo2YZljDEmDVlzN8aYNBTW5r4y6AABsJq7Bqu5a0h6zaEcczfGGHNxYT1yN8YYcxHW3I0xJg2ldHNPpYW5/eKh5gUi8pGI7BORLSJyTRA5Eyleza32myYiKiKhv2zOS80iUhJ7rfeLyFq/Myaah/f2EBHZJiI1sff35CByJoqIVIjICRGpbed5EZFlsX+PfSJyY0IDqGpKfuCmF/4MGAZkA3uB/Db7/Bx4NbY9A1gfdG4fah4P5MS253WFmmP7XQ7sAKqAoqBz+/A6XwfUAH1ij68IOrcPNa8E5sW284EjQefuZM0/BG4Eatt5fjKwEbeS3c3Ae4n8/ql85J5SC3P7JG7NqrpNVRtjD6twK2OFmZfXGWAJ8BvgWz/DJYmXmh8ElqvqKQBVPeFzxkTzUrMCvWPbuZy/4luoqOoOLr4i3VRgjTpVwPdE5MpEff9Ubu4JW5g7RLzU3Fop7jd/mMWtWUQKgcGq+hc/gyWRl9d5BDBCRHaJSJWITPItXXJ4qflXwH0icgy3fsR8f6IF5lJ/3i+Jp8U6ApKwhblDxHM9InIfUATcmtREyXfRmkWkG/Ai8BO/AvnAy+uciRuaGYf739lOESlQ1dNJzpYsXmqeCfxeVZeKSDFudbcCVT2b/HiBSGr/SuUj90tZmJs0WZjbS82IyETgaWCKqjb5lC1Z4tV8OVAAbBeRI7ixycqQn1T1+t7eoKrNqnoY+BTX7MPKS82lwBsAqrob6IGbYCtdefp576hUbu5dcWHuuDXHhihW4Bp72MdhIU7Nqtqgqv1UdaiqDsWdZ5iiqpFg4iaEl/f2n3EnzxGRfrhhmkO+pkwsLzUfBSYAiMhIXHOv8zWlvyqB+2NXzdwMNKjq8YT97UGfUY5ztnky8A/cWfanY59bjPvhBvfi/xE4COwBhgWd2Yea3wH+DURjH5VBZ052zW323U7Ir5bx+DoLUA58BHwIzAg6sw815wO7cFfSRIE7gs7cyXpfB44Dzbij9FJgLjC31Wu8PPbv8WGi39c2/YAxxqShVB6WMcYY00HW3I0xJg1ZczfGmDRkzd0YY9KQNXdjjElD1tyNMSYNWXM3xpg09D+babo9vppHCQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = lgb_sklearn(X_train,  X_test, y_train, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\n",
    "# # 逻辑回归模型\n",
    "# log_model = LogisticRegression()\n",
    "# # 训练逻辑回归模型\n",
    "# log_model.fit(X_train, y_train)\n",
    " \n",
    "# # 预测y的值\n",
    "# y_pred = log_model.predict_proba(X_test)[:,1]\n",
    " \n",
    "# # 查看测试结果\n",
    "# roc_auc_score(y_test, y_pred)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn import metrics\n",
    "from  sklearn.datasets  import  make_hastie_10_2\n",
    "from xgboost.sklearn import XGBClassifier\n",
    "\n",
    "clf = XGBClassifier(\n",
    "silent=0 ,#设置成1则没有运行信息输出，最好是设置为0.是否在运行升级时打印消息。\n",
    "#nthread=4,# cpu 线程数 默认最大\n",
    "learning_rate= 0.3, # 如同学习率\n",
    "min_child_weight=1, \n",
    "# 这个参数默认是 1，是每个叶子里面 h 的和至少是多少，对正负样本不均衡时的 0-1 分类而言\n",
    "#，假设 h 在 0.01 附近，min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。\n",
    "#这个参数非常影响结果，控制叶子节点中二阶导的和的最小值，该参数值越小，越容易 overfitting。\n",
    "max_depth=6, # 构建树的深度，越大越容易过拟合\n",
    "gamma=0,  # 树的叶子节点上作进一步分区所需的最小损失减少,越大越保守，一般0.1、0.2这样子。\n",
    "subsample=1, # 随机采样训练样本 训练实例的子采样比\n",
    "max_delta_step=0,#最大增量步长，我们允许每个树的权重估计。\n",
    "colsample_bytree=1, # 生成树时进行的列采样 \n",
    "reg_lambda=1,  # 控制模型复杂度的权重值的L2正则化项参数，参数越大，模型越不容易过拟合。\n",
    "#reg_alpha=0, # L1 正则项参数\n",
    "#scale_pos_weight=1, #如果取值大于0的话，在类别样本不平衡的情况下有助于快速收敛。平衡正负权重\n",
    "#objective= 'multi:softmax', #多分类的问题 指定学习任务和相应的学习目标\n",
    "#num_class=10, # 类别数，多分类与 multisoftmax 并用\n",
    "n_estimators=100, #树的个数\n",
    "seed=1000 #随机种子\n",
    "#eval_metric= 'auc'\n",
    ")\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy : 0.9622\n"
     ]
    }
   ],
   "source": [
    "\n",
    "clf.fit(X_train,y_train,eval_metric='auc')\n",
    "y_pred = clf.predict(X_test)\n",
    "print(\"Accuracy : %.4g\" % metrics.accuracy_score(y_test, y_pred))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "clf.fit(X,Y,eval_metric='auc')\n",
    "y_pred_test = clf.predict(df_test)\n",
    "df_result = pd.DataFrame()\n",
    "df_result['PERSONID'] = df_test.index\n",
    "df_result['PREDICT'] = y_pred_test\n",
    "df_result.to_csv('data/predict_A.csv', sep = '\\t', header= False, index= False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# log_model_submit = LogisticRegression()\n",
    "# # 训练逻辑回归模型\n",
    "# log_model_submit.fit(X, Y)\n",
    " \n",
    "# # 预测y的值\n",
    "# y_pred = log_model_submit.predict_proba(df_test)\n",
    "\n",
    "# df_result = pd.DataFrame()\n",
    "# df_result['PERSONID'] = df_test.index\n",
    "# df_result['PREDICT'] = y_pred[:,1]\n",
    "# df_result.to_csv('data/predict_A.csv', sep = '\\t', header= False, index= False)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
